/*
 * Copyright 2008-2023 dexian.vip. All rights reserved.
 * Support: http://www.dexian.vip
 * License: http://www.dexian.vip/license
 */

package vip.dexian.core.base.query;

import vip.dexian.common.query.Filter;
import vip.dexian.common.query.Listable;
import vip.dexian.common.query.Order;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.experimental.SuperBuilder;
import org.springframework.ui.ModelMap;

import java.util.List;

/**
 * 列表（非分页）查询器
 *
 * @author 挺好的 2023年06月02日 9:38
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
@SuperBuilder
@EqualsAndHashCode (callSuper = false)
public abstract class BaseListableSearcher extends BaseSearchProperty implements BaseSearcher {

    /**
     * 从第几条开始。如果first == null || first < 0 ，则从{@link Listable#DEFAULT_FIRST}开始。
     */
    private Integer first;

    /**
     * 查询数量，最大由 {@link Listable#MAX_COUNT}定义
     */
    private Integer count;

    /**
     * 组装搜索条件，Listable提供了new Listable以及Builder方式创建。
     * 在该方法中因为数据从客户端接收，所以只能使用new Listable形式。通过setFirst、setCount方法来限制first和count。
     *
     * @return 列表搜索条件
     */
    @Override
    public Listable query () {

        List <Filter> filters = this.addFilters(this.getBeginDate(), this.getEndDate(), this.getSearchProperty(),
                this.getSearchValue(), this.getSearchPropertyType()
        );
        // 添加排序
        List <Order> orders = this.addOrders(this.getOrderProperty(), this.getOrderDirection());

        Listable listable = new Listable();

        listable.setFirst(this.first);
        listable.setCount(this.count);
        listable.setFilters(filters);
        listable.setOrders(orders);

        return listable;
    }

    /**
     * 设置到model map 中
     *
     * @param modelMap
     *         模型数据
     */
    @Override
    public void addAttribute (ModelMap modelMap) {
        modelMap.addAttribute("form", this);
    }
}
